统计一篇英文文章中出现次数最多的10个单词 - CSDN博客

创建时间:2018/3/15 9:27
来源:http://blog.csdn.net/u010512607/article/details/40005641


统计一篇英文文章中出现次数最多的10个单词

  1. package se;  
  2. import java.io.BufferedReader;  
  3. import java.io.File;  
  4. import java.io.FileReader;  
  5. import java.io.IOException;  
  6. import java.util.ArrayList;  
  7. import java.util.Collections;  
  8. import java.util.Comparator;  
  9. import java.util.HashMap;  
  10. import java.util.List;  
  11. import java.util.Map;  
  12. import java.util.Map.Entry;  
  13.   
  14. public class damn {  
  15.     public static void main(String[] args) throws IOException {  
  16.         String str2 = System.getProperty("java.io.tmpdir");  
  17.         System.out.println(str2);  
  18.         long start = System.currentTimeMillis(); // 程序开始时间  
  19.         File file = new File("C:/Users/Wll/Desktop/Computer.txt");  
  20.   
  21.         BufferedReader br = new BufferedReader(new FileReader(file));  
  22.         StringBuilder sb = new StringBuilder();  
  23.         String line = null;  
  24.         while ((line = br.readLine()) != null) {  
  25.             sb.append(line);  
  26.         }  
  27.         br.close(); // 关闭流  
  28.   
  29.         String words = sb.toString(); // 全部的单词字符串  
  30.         String targetString = words.replaceAll("[.,\"\\?!:;\\(\\)]"""); // 将标点替换为空  
  31.   
  32.         // 分词并且定义英文中不代表实际意义的一些单词,如介词、代词、情态动词等  
  33.         String[] singleWord = targetString.split(" ");  
  34.         String[] keys = { "you""i""he""she""me""him""her""it",  
  35.                 "they""them""we""us""your""yours""our""his",  
  36.                 "her""its""my""in""into""on""for""out""up",  
  37.                 "down""at""to""too""with""by""about""among",  
  38.                 "between""over""from""be""been""am""is""are",  
  39.                 "was""were""whthout""the""of""and""a""an",  
  40.                 "that""this""be""or""as""will""would""can",  
  41.                 "could""may""might""shall""should""must""has",  
  42.                 "have""had""than" };  
  43.   
  44.         // 将一部分常见的无意义的英语单词替换为字符 '#' 以便后面输出单词出现次数时的判断  
  45.         for (int i = 0; i < singleWord.length; i++) {  
  46.             for (String str : keys) {  
  47.                 if (singleWord[i].equals(str))  
  48.                     singleWord[i] = "#";  
  49.             }  
  50.         }  
  51.   
  52.         // 将单词以及其出现的次数关联起来  
  53.         for (int i = 0; i < singleWord.length; i++) {  
  54.             count++; // 计算单词个数  
  55.             if ((wordMap.get(singleWord[i]) != null)) {  
  56.                 int value = ((Integer) wordMap.get(singleWord[i])).intValue();  
  57.                 value++;  
  58.                 wordMap.put(singleWord[i].toLowerCase(), new Integer(value)); // 将单词转换为小写存放以统一格式  
  59.             } else {  
  60.                 wordMap.put(singleWord[i].toLowerCase(), new Integer(1));  
  61.             }  
  62.   
  63.         }  
  64.   
  65.         System.out.println("\t\t--文件信息--");  
  66.         System.out.println("     名称: " + file.getName() + "    大小: "  
  67.                 + file.length() / 1024 + " KB");  
  68.         System.out.println("\t\t--文件信息--");  
  69.         System.out.println();  
  70.         System.out.println("■■■■ " + count + " 个单词中出现频率最高的 10 个单词如下■■■■");  
  71.   
  72.         // 比较器, 按值排序  
  73.         System.setProperty("java.util.Arrays.useLegacyMergeSort""true");  
  74.         List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(  
  75.                 wordMap.entrySet());  
  76.         Collections.sort(list, new Comparator<Entry<String, Integer>>() {  
  77.             public int compare(Entry<String, Integer> e1,  
  78.                     Entry<String, Integer> e2) {  
  79.                 if (e2.getValue() != null && e1.getValue() != null  
  80.                         && e2.getValue().compareTo(e1.getValue()) > 0) {  
  81.                     return 1;  
  82.                 } else {  
  83.                     return -1;  
  84.                 }  
  85.             }  
  86.         });  
  87.   
  88.         int wordCount = 1// 记录已经输出单词的个数  
  89.         for (Map.Entry<String, Integer> entry : list) {  
  90.             if (entry.getKey().equals("#")) // 相当于过滤作用,不输出介词、代词、情态动词等无意义单词  
  91.                 continue;  
  92.             System.out.printf("\t%2d、 %8s \t %4d次\n", wordCount,  
  93.                     entry.getKey(), entry.getValue());  
  94.             if (wordCount++ == 10) { // 表示只输出10个  
  95.                 long end = System.currentTimeMillis(); // 程序结束时间  
  96.                 System.out.println("■■■■■■■■■■■■■■■ 耗时 " + (end - start)  
  97.                         + " ms" + " ■■■■■■■■■■■■■■■■");  
  98.                 return;  
  99.             }  
  100.         }  
  101.     }  
  102.   
  103.     private static HashMap<String, Integer> wordMap = new HashMap<String, Integer>();  
  104.     private static int count = 0;  
  105. }  

        程序运行情况如下:

        总的来说,这个程序自己觉得还是完成得比较好,而且从中也学到了很多。比如正则表达式之前没怎么接触过,这次就学习了许多正则表达式相关的知识。另外,也进一步熟悉了HashMap类和ArrayList类。除此之外,还学到了一些编写程序的方法与技巧,使得代码条理更加清晰。